home *** CD-ROM | disk | FTP | other *** search
/ Mac Format 1997 July / macformat52.iso / mac / Shareware Plus / Educational / LEE 2.1 / Source / include.c < prev    next >
Text File  |  1996-07-29  |  4KB  |  164 lines

  1. /*
  2.  * Copyright (c) 1987 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms are permitted
  6.  * provided that the above copyright notice and this paragraph are
  7.  * duplicated in all such forms and that any documentation,
  8.  * advertising materials, and other materials related to such
  9.  * distribution and use acknowledge that the software was developed
  10.  * by the University of California, Berkeley.  The name of the
  11.  * University may not be used to endorse or promote products derived
  12.  * from this software without specific prior written permission.
  13.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  14.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  15.  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  16.  *
  17.  * ===================================================================
  18.  *
  19.  * These portable pseudo-random number generator routines
  20.  * are taken from the GAucsd source code but with some changes.
  21.  * The generator is based on the standard linear congruential
  22.  * method plus some randomizing shuffle from the state array.
  23.  */
  24.  
  25. #include "defs.h"
  26.  
  27.  
  28.  
  29. long Rstate[RAND_DEG] = {   0x9a319039,
  30.         0x32d9c024, 0x9b663182, 0x5da1f342, 0xde3b81e0, 0xdf0a6fb5,
  31.         0xf103bc02, 0x48f340fb, 0x7449e56b, 0xbeb1dbb0, 0xab5c5918,
  32.         0x946554fd, 0x8c2e680f, 0xeb3d799f, 0xb11ee0b7, 0x2d436b86,
  33.         0xda672e2a, 0x1588ca88, 0xe369735d, 0x904f35f7, 0xd7158fd6,
  34.         0x6fa6f051, 0x616e6b96, 0xac94efdc, 0x36413f93, 0xc622c298,
  35.         0xf5a42ab8, 0x8a88d77b, 0xf5ad9d0e, 0x8999220b, 0x27fb47b9
  36. };
  37.  
  38. long *fptr = &Rstate[3];
  39. long *rptr = &Rstate[0];
  40. long *end_ptr = &Rstate[RAND_DEG];
  41.  
  42. int Getptr()
  43. {
  44.         return(fptr - &Rstate[0]);
  45. }
  46.  
  47. Setptr(p) int p;
  48. {
  49.         fptr = &Rstate[p];
  50.         rptr = fptr - 3;
  51.         if (rptr < &Rstate[0]) rptr += RAND_DEG;
  52. }
  53.  
  54. /* returns a long int between 0 and LONG_MAX inclusive */
  55. long Rand()
  56. {
  57.         long i;
  58.  
  59.         *fptr += *rptr;
  60.         i = (*fptr >> 1) & LONG_MAX;
  61.         if (++fptr >= end_ptr)
  62.         {
  63.                 fptr = &Rstate[0];
  64.                 ++rptr;
  65.         }
  66.         else
  67.                 if (++rptr >= end_ptr) rptr = &Rstate[0];
  68.         return(i);
  69. }
  70.  
  71. Srand(x) long x;
  72. {
  73.         register int i;
  74.  
  75.         Rstate[0] = x;
  76.         for (i = 1; i < RAND_DEG; i++)
  77.                 Rstate[i] = 1103515245 * Rstate[i - 1] + 12345;
  78.  
  79.         fptr = &Rstate[3];
  80.         rptr = &Rstate[0];
  81.  
  82.         for (i = 0; i < 10*RAND_DEG; i++) (void) Rand();
  83. }
  84.  
  85. /*
  86.  * Copyright (c) 1987 Regents of the University of California.
  87.  *
  88.  * =========================== END ===========================
  89.  *
  90.  * LEE routines for random numbers:
  91.  *      rans()  generates a float random number in [-n,+n]
  92.  *      mrand() generates an int random number in [0,i-1]
  93.  */
  94.  
  95. float
  96. rans(n)
  97.         float   n;
  98. {
  99.         return (((((float)Rand())/(float)LONG_MAX)*2*n)-n);
  100. }
  101.  
  102. int
  103. mrand(i)
  104.         int i;
  105. {
  106.         return ( (int) (Rand()%i) );
  107. }
  108.  
  109.  
  110.  
  111. /*
  112.  *    routine to read command-line options...
  113.  *     @(#)getopt.c 1.1 86/09/24 SMI; from S5R2 1.5  
  114.  */
  115.  
  116. int
  117. getopt(argc, argv, opts)
  118. int    argc;
  119. char    **argv, *opts;
  120. {
  121.     extern int strcmp();
  122.     extern char *strchr();
  123.  
  124.     static int optind = 1;
  125.     static int sp = 1;
  126.     register int c;
  127.     register char *cp;
  128.  
  129.     if(sp == 1)
  130.         if(optind >= argc ||
  131.            argv[optind][0] != '-' || argv[optind][1] == '\0')
  132.             return(EOF);
  133.         else if(strcmp(argv[optind], "--") == 0) {
  134.             optind++;
  135.             return(EOF);
  136.         }
  137.     c = argv[optind][sp];
  138.     if(c == ':' || (cp=strchr(opts, c)) == NULL) {
  139.         if(argv[optind][++sp] == '\0') {
  140.             optind++;
  141.             sp = 1;
  142.         }
  143.         return('?');
  144.     }
  145.     if(*++cp == ':') {
  146.         if(argv[optind][sp+1] != '\0')
  147.             optarg = &argv[optind++][sp+1];
  148.         else if(++optind >= argc) {
  149.             sp = 1;
  150.             return('?');
  151.         } else
  152.             optarg = argv[optind++];
  153.         sp = 1;
  154.     } else {
  155.         if(argv[optind][++sp] == '\0') {
  156.             sp = 1;
  157.             optind++;
  158.         }
  159.         optarg = NULL;
  160.     }
  161.     return(c);
  162. }
  163.  
  164.